"use strict"
function testfuncti() {
    //函数定义：两种方式
//第一种方式
    function abs(x) {
        if (typeof x!=='number'){
            throw 'Not a number';
        }
        if (x>=0){
            return x;
        } else {
            return -x;
        }
    }
    /*
    * （1）func指出这是一个函数定义
    * （2）abs是函数的名称
    * （3）（x）函数参数，多个参数用逗号隔开
    * （4）{...}函数体，可以有若干语句，甚至没有任何语句
    * */

//由于javascript的函数也是一个对象，abs()函数实际上是一个函数对象，而函数名abs可以视为指向该函数的变量
//第二种方式：
    var abs=function (x) {
        if (x>=0){
            return x;
        } else{
            return -x;
        }
    };
    /*
    * （1）没有函数名，是匿名函数
    * （2）直接调用变量abs
    * （3）因为是赋值语句，最后以分号结束
    * */
    console.log( abs(10));
    console.log(abs(-20));
    //由于JavaScript允许传入任意个参数而不影响调用，因此传入的参数比定义的参数多也没有问题，虽然函数内部并不需要这些参数

    console.log(abs(10,'hello','wa'));//10
    //传入的参数比定义的少也没有问题,
    console.log(abs());//NaN

}

//关键字aeguments
function testArguments() {
    //arguments它只在函数内部起作用，并且永远指向当前函数的调用者传入的所有参数
    function foo(x) {
        console.log('x='+x);//10
        for (var i=0;i<arguments.length;i++){
            console.log('arg'+i+'='+arguments[i]);
        }
    }
    foo(10,20,30);

    //利用arguments，你可以获得调用者传入的所有参数。也就是说，即使函数不定义任何参数，还是可以拿到参数的值
    function abs() {
        if (arguments.length===0){
            return 0;
        }
        var x=arguments[0];
        if (x>=0){
            return x;
        } else{
            return -x;
        }
        //return x>=0?x:-x;
    }
    console.log(abs());
    console.log(abs(10));
    console.log(abs(-9));
}

//rest参数
function testRest() {
//由于JavaScript函数允许接受任意个参数，于是我们不得不用arguments来获取所有参数
    function foo(a,b,...rest) {
        // var i,rest=[];
        // if (arguments.length>2){
        //     for (i=2;i<arguments.length;i++){
        //         rest.push(arguments[i]);
        //     }
        // }
        console.log('a='+a);
        console.log('b='+b);
        console.log(rest);
        }
    foo(1,2,3,4,5);
    foo(1);

}

//rest参数编写一个sum()函数，接收任意个参数并返回它们的和
function testSum() {
     function sum(...rest) {

     }
        var i,args=[];
        for (i=1;i<=100;i++){
            args.push(i);
        }
        if (sum()!==0){
            console.log('测试失败：sum()='+sum());
        } else if (sum(1)!==1){
            console.log('测试失败：sum()='+sum(1));
        } else if(sum(2,3)!==5){
            console.log('测试失败：sum(2,3)='+sum(2,3));
        }else if (sum.apply(null,args)!==5050){
            console.log('测试失败：sum(1,2,3,...,100)='+sum.apply(null,args));
        }else {
            console.log('测试成功！');
        }

}

//练习
function practice() {
    //定义一个计算圆面积的函数area_of_circle()，它有两个参数：
    // r: 表示圆的半径；
    // pi: 表示π的值，如果不传，则默认3.14
    function area_of_circle(r,pi) {
     return  pi*r*r;

    }
    // if (area_of_circle(2)===12.56&&area_of_circle(2,3.1416===12.5664)){
    //     console.log('测试成功!');
    // } else {
    //     console.log('测试失败');
    // }
    var s=area_of_circle(2,3.14);
    console.log(s);
}

//比较大小
function compare() {
    //传入两个数，比较大小
    function Max(a,b) {
        if (a>b){
            return{
                a
            };
        } else {
            return{
                b
            };
        }
    }
    var s=Max(15,20);
    console.log(s);
}
